home *** CD-ROM | disk | FTP | other *** search
- /* user data. should be modified externally */
-
- #define ID_CHECKSUM 88
- #define USER_NR 47
- #define USER_NAME "Kenichi Uda"
- #define USER_STREET "85 Imahara cho Nisigamo Kita Ku"
- #define USER_CITY "Kyoto 603-8842"
- #define USER_COUNTRY "Japan"
- #define USER_STREAM "X-!axl5aw3xbq21wr4aqegaz!-=hpA=?=Xq@x5Q6a!p_xAX"
-
-
- #define REVISION "40.2"
- #define AUTHOR "Miloslaw Smyk"
- #define VERNUM 40
- #define REVNUM 2
-
- #define PROGNAME "wfmhcybergfx_key.library"
-
-
- /* some useful includes */
-
- #include <string.h>
- #include <exec/types.h>
- #include <exec/execbase.h>
- #include <exec/memory.h>
- #include <exec/nodes.h>
- #include <clib/exec_protos.h>
- #include <pragmas/exec_sysbase_pragmas.h>
- #include <clib/alib_protos.h>
- #include <clib/macros.h>
-
- #include "wfmhcybergfx_key.h"
- #include "key.h"
- /* standard version string */
-
- int dither_type = DT_NONE;
- static const char version[] = "\0$VER: " PROGNAME " " REVISION " " __AMIGADATE__ " © 1995-97 " AUTHOR " / World Federation of Mad Hackers";
- static const char number[] = USER_STREAM;
- struct Library *SysBase;
- struct KeyBase *KeyBase;
-
- struct UserInfo authorized_user =
- {
- USER_NR,
- USER_NAME,
- USER_STREET,
- USER_CITY,
- USER_COUNTRY
- };
-
-
- /*
- ** 4x4 4-bit dispersed dot ordered dither pattern, which is the base
- ** for final dither pattern, calculated as soon as screen depth
- ** is known.
- */
-
- const UBYTE dithBase[4][4] = {
- 1, 15, 2, 12,
- 9, 5, 10, 7,
- 3, 13, 0, 14,
- 11, 7, 8, 4
- };
-
- static struct dith
- {
- UBYTE r, g, b, g2;
- } dith[4][4];
-
- struct dither_val
- {
- UBYTE r[2], g[2], b[2], g2[2];
- } dither[256];
-
- int red5[256], green5[256], blue5[256], green6[256];
-
- enum {COL_ORIGINAL, COL_SHIFTED};
-
- /* macros we use to get fractions with integer math */
- #define SCALING_FACTOR 4
- #define HALF 8
- #define DESCALE(expr) (((expr) + HALF) >> SCALING_FACTOR)
-
-
- void __asm __saveds LIBInitDithering(void)
- {
- int i,j;
-
- /* calculate errors for every possible pixel value. */
- for(i = 0; i < 256; i++)
- {
- red5[i] = i - ((i + 4) & ~0x07);
- green5[i] = i - ((i + 4) & ~0x07);
- green6[i] = i - ((i + 2) & ~0x03);
- blue5[i] = i - ((i + 4) & ~0x07);
- }
-
- for(i = 0; i < 256; i++)
- {
- dither[i].r[COL_ORIGINAL] = i & ~0x07;
- dither[i].g[COL_ORIGINAL] = i & ~0x07;
- dither[i].g2[COL_ORIGINAL] = i & ~0x03;
- dither[i].b[COL_ORIGINAL] = i & ~0x07;
-
- dither[i].r[COL_SHIFTED] = MIN(i + 8, 255);
- dither[i].g[COL_SHIFTED] = MIN (i + 8, 255);
- dither[i].g2[COL_SHIFTED] = MIN(i + 4,255);
- dither[i].b[COL_SHIFTED] = MIN(i + 8, 255);
- }
-
- for(j = 0; j < 4; j++)
- for(i = 0; i < 4; i++)
- {
- dith[i][j].r = (dithBase[i][j] * 16) / 32;
- dith[i][j].g = (dithBase[i][j] * 16) / 32;
- dith[i][j].g2 = (dithBase[i][j] * 16) / 64;
- dith[i][j].b = (dithBase[i][j] * 16) / 32;
- }
- }
-
- void __asm __saveds LIBSetDitherType(register __d0 UBYTE type)
- {
- dither_type = type;
- }
-
- void __asm LIBCalcChecksum(register __d0 int *sum, register __a0 char *txt)
- {
- while(*txt)
- *sum ^= *txt++;
- }
-
- void __asm __saveds LIBDitherLine(register __a0 struct R3DHandle *handle, register __a1 UBYTE *buf, register __d0 int len, register __d1 int x, register __d2 int y)
- {
- int i;
- int bsame_r, bnext_r, next_r;
- int bsame_g, bnext_g, next_g;
- int bsame_b, bnext_b, next_b;
- UBYTE *inptr;
- SHORT *errptr;
- int delta;
- int temp;
- volatile int check = USER_NR + 151429;
-
- if(handle->depth == 15 || handle->depth == 16)
- {
- switch(dither_type)
- {
- case DT_FS:
- if(handle->line_width != len)
- {
- if(handle->line)
- FreeVec(handle->line);
-
- handle->line = AllocVec(sizeof(SHORT) * (len + 2) * 3, MEMF_ANY | MEMF_CLEAR);
- handle->line_width = len;
- }
-
- inptr = buf;
- errptr = handle->line + 3;
-
- /* make sure there is no error at the start of the line */
- for(i = 0; i < 3; i++)
- errptr[i] = 0;
-
- bsame_r = bnext_r = next_r = 0;
- bsame_g = bnext_g = next_g = 0;
- bsame_b = bnext_b = next_b = 0;
-
- for(i = 0; i < len; i++)
- {
- /* red component */
-
- temp = *inptr + DESCALE(next_r + bsame_r);
-
- if(temp < 0)
- *inptr = 0;
- else
- if(temp > 255)
- *inptr = 255;
- else
- *inptr = temp;
-
- /* right-down pixel gets 1/16 of error */
- bnext_r = red5[*inptr];
- delta = bnext_r << 1;
-
- /* left-down pixel gets 3/16 of error */
- next_r = bnext_r + delta;
- *(errptr - 3) += next_r;
-
- /* pixel below gets 5/16 of error */
- next_r += delta;
- *errptr += next_r;
-
- /* next pixel (to the right) gets 7/16 of error */
- next_r += delta;
-
- /* try to get closest match with color-gun */
- if(*inptr < 252)
- *inptr += 4;
-
- bsame_r = *(errptr);
- *(errptr) = bnext_r;
- errptr++;
- inptr++;
-
- /* green component */
-
- temp = *inptr + DESCALE(next_g + bsame_g);
-
- if(temp < 0)
- *inptr = 0;
- else
- if(temp > 255)
- *inptr = 255;
- else
- *inptr = temp;
-
- /* right-down pixel gets 1/16 of error */
- bnext_g = handle->depth == 15 ? green5[*inptr] : green6[*inptr];
- delta = bnext_g << 1;
-
- /* left-down pixel gets 3/16 of error */
- next_g = bnext_g + delta;
- *(errptr - 3) += next_g;
-
- /* pixel below gets 5/16 of error */
- next_g += delta;
- *errptr += next_g;
-
- /* next pixel (to the right) gets 7/16 of error */
- next_g += delta;
-
- /* try to get closest match with color-gun */
- if(handle->depth == 15)
- {
- if(*inptr < 252)
- *inptr += 4;
- }
- else
- {
- if(*inptr < 254)
- *inptr += 2;
- }
-
- bsame_g = *(errptr);
- *(errptr) = bnext_g;
- errptr++;
- inptr++;
-
- /* blue component */
-
- temp = *inptr + DESCALE(next_b + bsame_b);
-
- if(temp < 0)
- *inptr = 0;
- else
- if(temp > 255)
- *inptr = 255;
- else
- *inptr = temp;
-
- /* right-down pixel gets 1/16 of error */
- bnext_b = blue5[*inptr];
- delta = bnext_b << 1;
-
- /* left-down pixel gets 3/16 of error */
- next_b = bnext_b + delta;
- *(errptr - 3) += next_b;
-
- /* pixel below gets 5/16 of error */
- next_b += delta;
- *errptr += next_b;
-
- /* next pixel (to the right) gets 7/16 of error */
- next_b += delta;
-
- /* try to get closest match with color-gun */
- if(*inptr < 252)
- *inptr += 4;
-
- bsame_b = *(errptr);
- *(errptr) = bnext_b;
-
- errptr++;
-
- /* advance input pointer */
- inptr += 2;
- }
-
- break;
-
- case DT_ORDERED:
- FindTask(NULL);
-
- if(handle->depth == 15)
- for(i = 0; i < len * 4; i += 4)
- {
- if(buf[i] - dither[buf[i]].r[COL_ORIGINAL] > dith[y & 3][(i / 4) & 3].r)
- buf[i] = dither[buf[i]].r[COL_SHIFTED];
- if(buf[i + 1] - dither[buf[i + 1]].g[COL_ORIGINAL] > dith[y & 3][(i / 4) & 3].g)
- buf[i + 1] = dither[buf[i + 1]].g[COL_SHIFTED];
- if(buf[i + 2] - dither[buf[i + 2]].b[COL_ORIGINAL] > dith[y & 3][(i / 4) & 3].b)
- buf[i + 2] = dither[buf[i + 2]].b[COL_SHIFTED];
- }
- else
- for(i = 0; i < len * 4; i += 4)
- {
- if(buf[i] - dither[buf[i]].r[COL_ORIGINAL] > dith[y & 3][(i / 4) & 3].r)
- buf[i] = dither[buf[i]].r[COL_SHIFTED];
- if(buf[i + 1] - dither[buf[i + 1]].g2[COL_ORIGINAL] > dith[y & 3][(i / 4) & 3].g2)
- buf[i + 1] = dither[buf[i + 1]].g2[COL_SHIFTED];
- if(buf[i + 2] - dither[buf[i + 2]].b[COL_ORIGINAL] > dith[y & 3][(i / 4) & 3].b)
- buf[i + 2] = dither[buf[i + 2]].b[COL_SHIFTED];
- }
- break;
- }
- }
-
- check++;
- }
-
- struct UserInfo * __asm __saveds LIBGetUserInfo(void)
- {
- int sum = 0;
-
- CalcChecksum(&sum, authorized_user.name);
- CalcChecksum(&sum, authorized_user.street);
- CalcChecksum(&sum, authorized_user.city);
- CalcChecksum(&sum, authorized_user.country);
- sum += authorized_user.number;
-
- // printf("sum: %d\n", ((sum >> 1) - 4) << 1);
- authorized_user.sum = sum;
-
- SysBase = (*(struct Library **)((sum >> 1) - (ID_CHECKSUM >> 1)));
-
- return(&authorized_user);
- }
-
- int __asm __saveds __UserLibInit(register __a6 struct KeyBase *libbase)
- {
- KeyBase = libbase;
- // SysBase = (*(struct Library **)4);
-
- return(0);
- }
-
- void __saveds __UserLibCleanup(void)
- {
- }
-